#if !defined(__TAMPON_H)
#define __TAMPON_H

/**
 * Un tampon circulaire borné non sécurisé et surement bon à rien.
 * Améliorations à faire dans un futur alternatif :
 *	- utiliser des pointeurs ou des itérateurs;
 *	- ou utiliser la STL carrément...
 */
template <class T, int Capacite>
class tampon {
	T tampon_[Capacite];
	int nb_pleins_;
	int tete_;
	int queue_;
public:
	tampon() throw() : nb_pleins_(0), tete_(0), queue_(0) {}
	virtual ~tampon() throw() {}
	bool est_vide() { return nb_pleins_ == 0; }
	bool est_plein() { return nb_pleins_ == Capacite; }
	
	void deposer(T valeur) {
		tampon_[queue_] = valeur;
		queue_ = (queue_ + 1) % Capacite;
		++nb_pleins_;
	}
	T &prelever() {
		int ancienne_tete = tete_;
		tete_ = (tete_ + 1) % Capacite;
		nb_pleins_--;
		return tampon_[ancienne_tete];
	}
};

#endif
